package com.divemotor.ventarepuestosinternet.service.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.divemotor.ventarepuestosinternet.dao.AdministradorDAO;
import com.divemotor.ventarepuestosinternet.dao.UsuarioDAO;
import com.divemotor.ventarepuestosinternet.dao.VendedorDAO;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Administrador;
import com.divemotor.ventarepuestosinternet.model.Perfil;
import com.divemotor.ventarepuestosinternet.model.Usuario;
import com.divemotor.ventarepuestosinternet.service.AdministradorService;
import com.divemotor.ventarepuestosinternet.service.SupervisorService;
import com.divemotor.ventarepuestosinternet.service.VendedorService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;
import com.divemotor.ventarepuestosinternet.util.Encriptacion;
import com.divemotor.ventarepuestosinternet.util.FechasUtil;

@Service(value = "administradorService")
@Transactional(rollbackFor=Exception.class)
public class AdministradorServiceImpl implements AdministradorService, Serializable {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private AdministradorDAO administradorDAO;
	@Autowired
	private VendedorDAO vendedorDAO;
	@Autowired
	private UsuarioDAO usuarioDAO;
	@Autowired
	private SupervisorService supervisorService;
	@Autowired
	private VendedorService vendedorService;
	
	@Override
	public List<Administrador> buscarAdministradores(Administrador administrador) throws DivemotorBusinessException {
		return administradorDAO.buscarAdministradores(administrador);
	}

	@Override
	public Administrador obtenerPorId(Administrador administrador) throws DivemotorBusinessException {		
		return administradorDAO.obtenerPorId(administrador.getIdAdministrador());
	}

	@Override
	public void insertar(Administrador administrador) throws DivemotorBusinessException {
        administrador.setFechaCreacion(FechasUtil.obtenerFechaActual());
        administrador.setUsuarioCreacion(DatosDeSession.obtenerUsuarioAutenticado());
        administrador.getUsuario().setPais(DatosDeSession.obtenerPaisDelUsuarioAutenticado());
        administrador.getUsuario().setContrasenia(Encriptacion.encriptarMD5(administrador.getUsuario().getContrasenia()));

        Usuario user = usuarioDAO.obtenerPorUsuarioLogin(administrador.getUsuario());
        
        if(user!=null){
        	if(user.getListaPerfiles().size()==0){
    			user.setApellidos(administrador.getUsuario().getApellidos());
    			user.setContrasenia(administrador.getUsuario().getContrasenia());
    			user.setNombres(administrador.getUsuario().getNombres());
    			user.setPais(administrador.getUsuario().getPais());
    			user.setUsuario(administrador.getUsuario().getUsuario());
    			user.setListaPerfiles(administrador.getUsuario().getListaPerfiles());
    			administrador.setUsuario(user);
    			administradorDAO.insertar(administrador);
    			usuarioDAO.actualizarUsuarioExistente(user);                
        	}else{
        		user.setApellidos(administrador.getUsuario().getApellidos());
    			user.setContrasenia(administrador.getUsuario().getContrasenia());
    			user.setNombres(administrador.getUsuario().getNombres());
    			user.setPais(administrador.getUsuario().getPais());
    			user.setUsuario(administrador.getUsuario().getUsuario());
    		    List<Perfil> nuevaLista = user.getListaPerfiles();
    		    nuevaLista.add(new Perfil(Constantes.ID_PERFIL_ADMINISTRADOR));
    			user.setListaPerfiles(nuevaLista);
    			administrador.setUsuario(user);
    			administradorDAO.insertar(administrador);
    			usuarioDAO.actualizarUsuarioExistente(user);  
        	}
        }else{
	        usuarioDAO.insertar(administrador.getUsuario());
	        administradorDAO.insertar(administrador);	
        }
             
	}

	@Override
	public void actualizar(Administrador administrador) throws DivemotorBusinessException {
		administrador.setFechaModificacion(FechasUtil.obtenerFechaActual());
		administrador.setUsuarioModificacion(DatosDeSession.obtenerUsuarioAutenticado());
	    Usuario usu = usuarioDAO.obtenerListadePerfiles(administrador.getUsuario());
	    administrador.getUsuario().setListaPerfiles(usu.getListaPerfiles());
		usuarioDAO.actualizar(administrador.getUsuario());
		administradorDAO.actualizar(administrador);
	}

	@Override
	public void eliminar(Administrador administrador) throws DivemotorBusinessException {
		administrador.setEstado(Constantes.ESTADO_ELIMINADO);
		administrador.setFechaEliminacion(FechasUtil.obtenerFechaActual());
		administrador.setUsuarioEliminacion(DatosDeSession.obtenerUsuarioAutenticado());
		List<Perfil> lsList = new ArrayList<Perfil>();
		administrador.getUsuario().setListaPerfiles(lsList);
		administradorDAO.eliminarConEstado(administrador);
		usuarioDAO.eliminar(administrador.getUsuario());
	}

	@Override
	public List<Administrador> listar() throws DivemotorBusinessException {
		return administradorDAO.listarTodos();
	}

	@Override
	public void migrarUsuario(Integer perfilAntiguo , Administrador administrador) throws DivemotorBusinessException  {
	
		Usuario user = usuarioDAO.obtenerListadePerfiles(administrador.getUsuario());
		List<Perfil>lstPerfilesAntiguo  = user.getListaPerfiles();
		List<Perfil> lstNueva = new ArrayList<Perfil>();
		
		for (int i = 0; i < lstPerfilesAntiguo.size(); i++) {
		  if(!(lstPerfilesAntiguo.get(i).getIdPerfil().equals(perfilAntiguo))){
	    		 lstNueva.add(lstPerfilesAntiguo.get(i));
	    	  }
		}
	  
		lstNueva.add(new Perfil(Constantes.ID_PERFIL_ADMINISTRADOR));
		administrador.getUsuario().setListaPerfiles(lstNueva);
		supervisorService.eliminarPorUsuario(administrador.getUsuario());
	   	vendedorService.eliminarPorUsuario(administrador.getUsuario());
	   	  
	    administrador.setUsuarioCreacion(DatosDeSession.obtenerUsuarioAutenticado());
	    administrador.setFechaCreacion(FechasUtil.obtenerFechaActual());
	    administrador.getUsuario().setPais(DatosDeSession.obtenerPaisDelUsuarioAutenticado());
	 	usuarioDAO.actualizarUsuarioExistente(administrador.getUsuario()); 
	 	administradorDAO.insertarSinRetorna(administrador);	
	}

	@Override
	public void eliminarPorUsuario(Usuario usuario) throws DivemotorBusinessException {
		Administrador administrador = obtenerPorIdUsuario(usuario);
		if(administrador != null){
			administrador.setEstado(Constantes.ESTADO_ELIMINADO);
			List<Perfil> perfiles = new ArrayList<Perfil>();
			administrador.getUsuario().setListaPerfiles(perfiles);
			usuarioDAO.actualizarUsuarioExistente(administrador.getUsuario());
			administrador.setUsuarioEliminacion(DatosDeSession.obtenerUsuarioAutenticado());
			administrador.setFechaEliminacion(FechasUtil.obtenerFechaActual());
			administradorDAO.eliminarPorUsuario(administrador);
		}
	}

	private Administrador obtenerPorIdUsuario(Usuario usuario) {
		return administradorDAO.obtenerPorIdUsuario(usuario);
	}

	@Override
	public Administrador obtenerPorUsuario(Usuario user) throws DivemotorBusinessException {
		return administradorDAO.obtenerPorIdUsuario(user);
	}
	
}
